package com.h2cloud.Proxy._1_staticProxy;

/**
 * @Package: com.h2cloud.Proxy
 * @ClassName: StaticProxyTest
 * @Author: h2cloud
 * @CreateTime: 2021/4/7 12:28 下午
 * @Description:
 */

/**
 * Calculator接口
 */
interface Calculator {

	int add(int a, int b);

	int subtract(int a, int b);
}

/**
 * 目标类，实现 Calculator接口
 */
class CalculatorImpl implements Calculator {

	// 加
	@Override
	public int add(int a, int b) {
		int result = a + b;
		return result;
	}

	// 减
	@Override
	public int subtract(int a, int b) {
		int result = a - b;
		return result;
	}

	// 乘法、除法...
}

// 代理类

/**
 * 静态代理类，实现Calculator接口
 */
class CalculatorProxy implements Calculator {
	// 代理对象内部维护一个目标对象引用
	private Calculator target;

	// 通过构造方法，传入目标对象
	public CalculatorProxy(Calculator target) {
		this.target = target;
	}

	// 调用目标对象的 add，并在前后打印日志
	@Override
	public int add(int a, int b) {
		System.out.println("add方法开始...");
		int result = target.add(a, b);
		System.out.println("add方法结束...");
		return result;
	}

	// 调用目标对象的 subtract，并在前后打印日志
	@Override
	public int subtract(int a, int b) {
		System.out.println("subtract方法开始...");
		int result = target.subtract(a, b);
		System.out.println("subtract方法结束...");
		return result;
	}

	// 乘法、除法...
}

// 测试静态代理
public class StaticProxyTest {
	public static void main(String[] args) {
		// 把目标对象通过构造器塞入代理对象
		Calculator calculator = new CalculatorProxy(new CalculatorImpl());
		// 代理对象调用目标对象方法完成计算，并在前后打印日志
		System.out.println("calculator.add(1, 2) = " + calculator.add(1, 2));
		System.out.println("calculator.subtract(2, 1) = " + calculator.subtract(2, 1));
	}
}

